﻿using HCMS.Const;
using HCMS.Entities.Manage;
using HCMS.Extensions;
using HCMS.IServices.Manage;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;

namespace HCMS.Web.Manage.ViewComponents
{
    #region 按钮权限 视图组件 公共处理方法
    /// <summary>
    /// 按钮权限 公共视图组件
    /// </summary>
    public class MenuCommonViewComponent : ViewComponent
    {
        private readonly IRoleMenuAppService roleMenuAppService;

        public MenuCommonViewComponent(IRoleMenuAppService roleMenuAppService)
        {
            this.roleMenuAppService = roleMenuAppService;
        }

        /// <summary>
        /// 组件执行方法
        /// </summary>
        /// <remarks>
        /// 注：为了防止以下情况，增加了 controllerName 参数。
        /// 
        /// 例如：案例编辑页，本身已经有 Add 按钮方法。
        /// 那么在案例编辑页配置图集的 Add 按钮方法，就需要传【图集控制器】名称，进行区分
        /// </remarks>
        /// <param name="onIsOnly">脚本方法名称是否唯一。默认不需要配置。true：使用【控制器名称_方法名称】进行唯一标识</param>
        /// <param name="controllerName">要显示的按钮对应控制器名称。不传：默认根据当前发起请求的控制器，查找权限按钮</param>
        /// <param name="actionNames">要显示的按钮名称</param>
        /// <returns></returns>
        public async Task<IViewComponentResult> InvokeAsync(bool onIsOnly = false, string controllerName = "", params string[] actionNames)
        {
            var viewModel = new List<Menu>();

            if (actionNames == null || actionNames.Length == 0)
            {
                return View(viewModel);
            }

            var roleId = Request.HttpContext.User.FindFirstValue(ManageConst_ClaimTypes.RoleId).ToInt(0);
            if (roleId == 0)
            {
                return View(viewModel);
            }

            // 获取当前请求 控制器 和 方法名称
            var currentControllerName = Request.RouteValues["controller"].ToString("");
            var currentActionName = Request.RouteValues["action"].ToString("");
            if (string.IsNullOrWhiteSpace(currentControllerName) || string.IsNullOrWhiteSpace(currentActionName))
            {
                return View(viewModel);
            }

            // 默认使用当前请求的控制器，查找【方法】按钮
            if (string.IsNullOrWhiteSpace(controllerName))
            {
                controllerName = currentControllerName;
            }

            // 获取按钮信息
            viewModel = await roleMenuAppService.FindMenuByRole(roleId, controllerName, actionNames);

            if (onIsOnly && viewModel != null && viewModel.Any())
            {
                viewModel.ForEach(t =>
                {
                    t.ActionName = $"{t.ControllerName.InitialSmall()}_{t.ActionName.InitialSmall()}";
                });
            }

            return View(viewModel);
        }
    }
    #endregion

    //---------------------- 按钮权限 视图组件类 --------------------------

    #region Button 标签
    /// <summary>
    /// 权限 - Button 标签
    /// </summary>
    public class MenuButtonViewComponent : MenuCommonViewComponent
    {
        public MenuButtonViewComponent(IRoleMenuAppService roleMenuAppService)
            : base(roleMenuAppService)
        {
        }
    }
    #endregion

    #region A 标签
    /// <summary>
    /// 权限 - A 标签
    /// </summary>
    public class MenuAViewComponent : MenuCommonViewComponent
    {
        public MenuAViewComponent(IRoleMenuAppService roleMenuAppService)
            : base(roleMenuAppService)
        {
        }
    }
    #endregion

    #region 提交按钮
    /// <summary>
    /// 权限 - 提交 按钮
    /// </summary>
    public class MenuSubmitViewComponent : MenuCommonViewComponent
    {
        public MenuSubmitViewComponent(IRoleMenuAppService roleMenuAppService)
            : base(roleMenuAppService)
        {
        }
    }
    #endregion

    #region 列表 - 单元格操作按钮
    /// <summary>
    /// 列表 - 单元格操作按钮
    /// </summary>
    /// <remarks>
    /// 只有两个按钮，直接显示全部功能
    /// 按钮超过两个，只会显示第一个按钮。其它按钮会收起，放在【更多】里面，让列表显示更简洁。
    /// </remarks>
    public class MenuListCellViewComponent : MenuCommonViewComponent
    {
        public MenuListCellViewComponent(IRoleMenuAppService roleMenuAppService)
            : base(roleMenuAppService)
        {
        }
    }
    #endregion
}
